[bits 32]
section .text
global switch_to
switch_to:
    ;栈中此处是返回地址
    push esi
    push edi
    push ebx
    push ebp
    mov eax, [esp+20] ; 得到栈中的参数cur，cur = [esp+20]
    mov [eax], esp ; 保存栈顶指针esp。task_struct的self_kstack字段
                    ; self_kstack在task_struct中的偏移为0
                    ; 所以直接往thread开通处存4字节便可

    mov eax,[esp+24] ; 得到栈中的参数next,next=[esp+24]
    mov esp,[eax] ; pcb的第一个成员是self_kstack成员
    ; 它用来记录0级栈顶指针，被换上cpu时用来恢复0级栈
    ; 0级栈中保存了进程或线程所以信息，包括3级栈指针
    pop ebp
    pop ebx
    pop edi
    pop esi
    ret ;返回到上面switch_to下面的那句注释的返回地址，
        ;未由中断进入，第一次执行时会返回到kernel_thread

